home *** CD-ROM | disk | FTP | other *** search
/ Aminet 33 / Aminet 33 - October 1999.iso / Aminet / gfx / show / vmpeg.lha / src / global.h < prev    next >
Encoding:
C/C++ Source or Header  |  1999-07-06  |  20.6 KB  |  739 lines

  1. /* global.h, global variables                                               */
  2.  
  3. /* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
  4.  
  5. /*
  6.  * Disclaimer of Warranty
  7.  *
  8.  * These software programs are available to the user without any license fee or
  9.  * royalty on an "as is" basis.  The MPEG Software Simulation Group disclaims
  10.  * any and all warranties, whether express, implied, or statuary, including any
  11.  * implied warranties or merchantability or of fitness for a particular
  12.  * purpose.  In no event shall the copyright-holder be liable for any
  13.  * incidental, punitive, or consequential damages of any kind whatsoever
  14.  * arising from the use of these programs.
  15.  *
  16.  * This disclaimer of warranty extends to the user of these programs and user's
  17.  * customers, employees, agents, transferees, successors, and assigns.
  18.  *
  19.  * The MPEG Software Simulation Group does not represent or warrant that the
  20.  * programs furnished hereunder are free of infringement of any third-party
  21.  * patents.
  22.  *
  23.  * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
  24.  * are subject to royalty fees to patent holders.  Many of these patents are
  25.  * general enough such that they are unavoidable regardless of implementation
  26.  * design.
  27.  *
  28.  */
  29.  
  30. #include "mpeg2dec.h"
  31.  
  32. /* choose between declaration (GLOBAL undefined)
  33.  * and definition (GLOBAL defined)
  34.  * GLOBAL is defined in exactly one file mpeg2dec.c)
  35.  */
  36.  
  37. #ifndef GLOBAL
  38. #define EXTERN extern
  39. #else
  40. #define EXTERN
  41. #endif
  42.  
  43. /* prototypes of global functions */
  44. /* readpic.c */
  45. void Substitute_Frame_Buffer _ANSI_ARGS_ ((int bitstream_framenum, 
  46.   int sequence_framenum));
  47.  
  48. /* Get_Bits.c */
  49. void Initialize_Buffer _ANSI_ARGS_((void));
  50. void Fill_Buffer _ANSI_ARGS_((void));
  51. unsigned int Show_Bits _ANSI_ARGS_((int n));
  52. unsigned int Get_Bits1 _ANSI_ARGS_((void));
  53. void Flush_Buffer _ANSI_ARGS_((int n));
  54. unsigned int Get_Bits _ANSI_ARGS_((int n));
  55. int Get_Byte _ANSI_ARGS_((void));
  56. int Get_Word _ANSI_ARGS_((void));
  57.  
  58. /* systems.c */
  59. void Next_Packet _ANSI_ARGS_((void));
  60. int Get_Long _ANSI_ARGS_((void));
  61. void Flush_Buffer32 _ANSI_ARGS_((void));
  62. unsigned int Get_Bits32 _ANSI_ARGS_((void));
  63.  
  64.  
  65. /* getblk.c */
  66. void Decode_MPEG1_Intra_Block _ANSI_ARGS_((int comp, int dc_dct_pred[]));
  67. void Decode_MPEG1_Non_Intra_Block _ANSI_ARGS_((int comp));
  68. void Decode_MPEG2_Intra_Block _ANSI_ARGS_((int comp, int dc_dct_pred[]));
  69. void Decode_MPEG2_Non_Intra_Block _ANSI_ARGS_((int comp));
  70.  
  71. /* gethdr.c */
  72. int Get_Hdr _ANSI_ARGS_((void));
  73. int Get_Hdr_Seek _ANSI_ARGS_((int delta));
  74. void next_start_code _ANSI_ARGS_((void));
  75. int slice_header _ANSI_ARGS_((void));
  76. void marker_bit _ANSI_ARGS_((char *text));
  77.  
  78. /* getpic.c */
  79. void Decode_Picture _ANSI_ARGS_((int bitstream_framenum, 
  80.   int sequence_framenum));
  81. void Output_Last_Frame_of_Sequence _ANSI_ARGS_((int framenum));
  82.  
  83. /* getvlc.c */
  84. int Get_macroblock_type _ANSI_ARGS_((void));
  85. int Get_motion_code _ANSI_ARGS_((void));
  86. int Get_dmvector _ANSI_ARGS_((void));
  87. int Get_coded_block_pattern _ANSI_ARGS_((void));
  88. int Get_macroblock_address_increment _ANSI_ARGS_((void));
  89. int Get_Luma_DC_dct_diff _ANSI_ARGS_((void));
  90. int Get_Chroma_DC_dct_diff _ANSI_ARGS_((void));
  91.  
  92. /* idct.c */
  93. void Fast_IDCT _ANSI_ARGS_((short *block));
  94. void Initialize_Fast_IDCT _ANSI_ARGS_((void));
  95.  
  96. /* Reference_IDCT.c */
  97. void Initialize_Reference_IDCT _ANSI_ARGS_((void));
  98. void Reference_IDCT _ANSI_ARGS_((short *block));
  99.  
  100. /* motion.c */
  101. void motion_vectors _ANSI_ARGS_((int PMV[2][2][2], int dmvector[2],
  102.   int motion_vertical_field_select[2][2], int s, int motion_vector_count, 
  103.   int mv_format, int h_r_size, int v_r_size, int dmv, int mvscale));
  104. void motion_vector _ANSI_ARGS_((int *PMV, int *dmvector,
  105.   int h_r_size, int v_r_size, int dmv, int mvscale, int full_pel_vector));
  106. void Dual_Prime_Arithmetic _ANSI_ARGS_((int DMV[][2], int *dmvector, int mvx, int mvy));
  107.  
  108. /* mpeg2dec.c */
  109. void Error _ANSI_ARGS_((char *text));
  110. void Warning _ANSI_ARGS_((char *text));
  111. void Print_Bits _ANSI_ARGS_((int code, int bits, int len));
  112.  
  113. /* recon.c */
  114. void form_predictions _ANSI_ARGS_((int bx, int by, int macroblock_type, 
  115.   int motion_type, int PMV[2][2][2], int motion_vertical_field_select[2][2], 
  116.   int dmvector[2], int stwtype));
  117.  
  118. /* spatscal.c */
  119. void Spatial_Prediction _ANSI_ARGS_((void));
  120.  
  121. /* store.c */
  122. void Write_Frame _ANSI_ARGS_((unsigned char *src[], int frame));
  123.  
  124. #ifdef DISPLAY
  125. /* display.c */
  126. void Initialize_Display_Process _ANSI_ARGS_((char *name));
  127. void Terminate_Display_Process _ANSI_ARGS_((void));
  128. void Display_Second_Field _ANSI_ARGS_((void));
  129. void dither _ANSI_ARGS_((unsigned char *src[]));
  130. void Initialize_Dither_Matrix _ANSI_ARGS_((void));
  131.  
  132. /* writeframe.s */
  133. void WriteFrame8 _ANSI_ARGS_((void *srcbuf,void *framebuf,
  134.                              int bpr,int width,int height));
  135. void WriteFrame15 _ANSI_ARGS_((unsigned char *src[],void *dst,
  136.                               int width,int height,int bpr,int modulo));
  137. void WriteFrame16 _ANSI_ARGS_((unsigned char *src[],void *dst,
  138.                               int width,int height,int bpr,int modulo));
  139. void WriteFrame32 _ANSI_ARGS_((unsigned char *src[],void *dst,
  140.                               int width,int height,int bpr,int modulo));
  141. void yuv2pip _ANSI_ARGS_((void *dst,unsigned char *src[],int x,int y,int br));
  142. #endif
  143.  
  144. /* global variables */
  145.  
  146. EXTERN char Version[]
  147. #ifdef GLOBAL
  148.   ="mpeg2decode V1.2a, 96/07/19"
  149. #endif
  150. ;
  151.  
  152. EXTERN char Author[]
  153. #ifdef GLOBAL
  154.   ="(C) 1996, MPEG Software Simulation Group"
  155. #endif
  156. ;
  157.  
  158.  
  159. /* zig-zag and alternate scan patterns */
  160. EXTERN unsigned char scan[2][64]
  161. #ifdef GLOBAL
  162. =
  163. {
  164.   { /* Zig-Zag scan pattern  */
  165.     0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,
  166.     12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,
  167.     35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,
  168.     58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63
  169.   },
  170.   { /* Alternate scan pattern */
  171.     0,8,16,24,1,9,2,10,17,25,32,40,48,56,57,49,
  172.     41,33,26,18,3,11,4,12,19,27,34,42,50,58,35,43,
  173.     51,59,20,28,5,13,6,14,21,29,36,44,52,60,37,45,
  174.     53,61,22,30,7,15,23,31,38,46,54,62,39,47,55,63
  175.   }
  176. }
  177. #endif
  178. ;
  179.  
  180. /* default intra quantization matrix */
  181. EXTERN unsigned char default_intra_quantizer_matrix[64]
  182. #ifdef GLOBAL
  183. =
  184. {
  185.   8, 16, 19, 22, 26, 27, 29, 34,
  186.   16, 16, 22, 24, 27, 29, 34, 37,
  187.   19, 22, 26, 27, 29, 34, 34, 38,
  188.   22, 22, 26, 27, 29, 34, 37, 40,
  189.   22, 26, 27, 29, 32, 35, 40, 48,
  190.   26, 27, 29, 32, 35, 40, 48, 58,
  191.   26, 27, 29, 34, 38, 46, 56, 69,
  192.   27, 29, 35, 38, 46, 56, 69, 83
  193. }
  194. #endif
  195. ;
  196.  
  197. /* non-linear quantization coefficient table */
  198. EXTERN unsigned char Non_Linear_quantizer_scale[32]
  199. #ifdef GLOBAL
  200. =
  201. {
  202.    0, 1, 2, 3, 4, 5, 6, 7,
  203.    8,10,12,14,16,18,20,22,
  204.   24,28,32,36,40,44,48,52,
  205.   56,64,72,80,88,96,104,112
  206. }
  207. #endif
  208. ;
  209.  
  210. /* color space conversion coefficients
  211.  * for YCbCr -> RGB mapping
  212.  *
  213.  * entries are {crv,cbu,cgu,cgv}
  214.  *
  215.  * crv=(255/224)*65536*(1-cr)/0.5
  216.  * cbu=(255/224)*65536*(1-cb)/0.5
  217.  * cgu=(255/224)*65536*(cb/cg)*(1-cb)/0.5
  218.  * cgv=(255/224)*65536*(cr/cg)*(1-cr)/0.5
  219.  *
  220.  * where Y=cr*R+cg*G+cb*B (cr+cg+cb=1)
  221.  */
  222.  
  223. /* ISO/IEC 13818-2 section 6.3.6 sequence_display_extension() */
  224.  
  225. EXTERN int Inverse_Table_6_9[8][4]
  226. #ifdef GLOBAL
  227. =
  228. {
  229.   {117504, 138453, 13954, 34903}, /* no sequence_display_extension */
  230.   {117504, 138453, 13954, 34903}, /* ITU-R Rec. 709 (1990) */
  231.   {104597, 132201, 25675, 53279}, /* unspecified */
  232.   {104597, 132201, 25675, 53279}, /* reserved */
  233.   {104448, 132798, 24759, 53109}, /* FCC */
  234.   {104597, 132201, 25675, 53279}, /* ITU-R Rec. 624-4 System B, G */
  235.   {104597, 132201, 25675, 53279}, /* SMPTE 170M */
  236.   {117579, 136230, 16907, 35559}  /* SMPTE 240M (1987) */
  237. }
  238. #endif
  239. ;
  240.  
  241.  
  242.  
  243.  
  244.  
  245. /* output types (Output_Type) */
  246. #define T_YUV   0
  247. #define T_SIF   1
  248. #define T_TGA   2
  249. #define T_PPM   3
  250. #define T_AMIGADIRECT 4
  251. #define T_AMIGAOS 5
  252. #define T_AMIGAPIP 6
  253.  
  254. /* decoder operation control variables */
  255. EXTERN int Output_Type;
  256. EXTERN int hiQdither;
  257.  
  258. /* decoder operation control flags */
  259. EXTERN int Quiet_Flag;
  260. EXTERN int Trace_Flag;
  261. EXTERN int Fault_Flag;
  262. EXTERN int Verbose_Flag;
  263. EXTERN int Two_Streams;
  264. EXTERN int Spatial_Flag;
  265. EXTERN int Reference_IDCT_Flag;
  266. EXTERN int Frame_Store_Flag;
  267. EXTERN int System_Stream_Flag;
  268. EXTERN int Display_Progressive_Flag;
  269. EXTERN int Ersatz_Flag;
  270. EXTERN int Big_Picture_Flag;
  271. EXTERN int Verify_Flag;
  272. EXTERN int Stats_Flag;
  273. EXTERN int User_Data_Flag;
  274. EXTERN int Main_Bitstream_Flag;
  275. EXTERN unsigned long Mode_ID;
  276. EXTERN int Enable_Sound;
  277. EXTERN int Frame_Skip;
  278. EXTERN int Double_Pixels;
  279. EXTERN int Fps_Flag;
  280. EXTERN int TimeCode_Flag;
  281. EXTERN int AllFrames;
  282. EXTERN double User_Defined_FPS;
  283.  
  284.  
  285. /* filenames */
  286. EXTERN char *Output_Picture_Filename;
  287. EXTERN char *Substitute_Picture_Filename;
  288. EXTERN char *Main_Bitstream_Filename; 
  289. EXTERN char *Enhancement_Layer_Bitstream_Filename; 
  290.  
  291.  
  292. /* buffers for multiuse purposes */
  293. EXTERN char Error_Text[256];
  294. EXTERN unsigned char *Clip;
  295.  
  296. /* pointers to generic picture buffers */
  297. EXTERN unsigned char *backward_reference_frame[3];
  298. EXTERN unsigned char *forward_reference_frame[3];
  299.  
  300. EXTERN unsigned char *auxframe[3];
  301. EXTERN unsigned char *current_frame[3];
  302. EXTERN unsigned char *substitute_frame[3];
  303.  
  304.  
  305. /* pointers to scalability picture buffers */
  306. EXTERN unsigned char *llframe0[3];
  307. EXTERN unsigned char *llframe1[3];
  308.  
  309. EXTERN short *lltmp;
  310. EXTERN char *Lower_Layer_Picture_Filename;
  311.  
  312.  
  313.  
  314.  
  315. /* non-normative variables derived from normative elements */
  316. EXTERN int Coded_Picture_Width;
  317. EXTERN int Coded_Picture_Height;
  318. EXTERN int Chroma_Width;
  319. EXTERN int Chroma_Height;
  320. EXTERN int block_count;
  321. EXTERN int Second_Field;
  322. EXTERN int profile, level;
  323.  
  324. /* normative derived variables (as per ISO/IEC 13818-2) */
  325. EXTERN int horizontal_size;
  326. EXTERN int vertical_size;
  327. EXTERN int mb_width;
  328. EXTERN int mb_height;
  329. EXTERN double bit_rate;
  330. EXTERN double frame_rate; 
  331. EXTERN double real_frame_rate;
  332. EXTERN int speed;    /* 0: speed ok, -1: we're too slow, 1: too fast */
  333.  
  334.  
  335. /* headers */
  336.  
  337. /* ISO/IEC 13818-2 section 6.2.2.1:  sequence_header() */
  338. EXTERN int aspect_ratio_information;
  339. EXTERN int frame_rate_code; 
  340. EXTERN int bit_rate_value; 
  341. EXTERN int vbv_buffer_size;
  342. EXTERN int constrained_parameters_flag;
  343.  
  344. /* ISO/IEC 13818-2 section 6.2.2.3:  sequence_extension() */
  345. EXTERN int profile_and_level_indication;
  346. EXTERN int progressive_sequence;
  347. EXTERN int chroma_format;
  348. EXTERN int low_delay;
  349. EXTERN int frame_rate_extension_n;
  350. EXTERN int frame_rate_extension_d;
  351.  
  352. /* ISO/IEC 13818-2 section 6.2.2.4:  sequence_display_extension() */
  353. EXTERN int video_format;  
  354. EXTERN int color_description;
  355. EXTERN int color_primaries;
  356. EXTERN int transfer_characteristics;
  357. EXTERN int matrix_coefficients;
  358. EXTERN int display_horizontal_size;
  359. EXTERN int display_vertical_size;
  360.  
  361. /* ISO/IEC 13818-2 section 6.2.3: picture_header() */
  362. EXTERN int temporal_reference;
  363. EXTERN int picture_coding_type;
  364. EXTERN int vbv_delay;
  365. EXTERN int full_pel_forward_vector;
  366. EXTERN int forward_f_code;
  367. EXTERN int full_pel_backward_vector;
  368. EXTERN int backward_f_code;
  369.  
  370.  
  371. /* ISO/IEC 13818-2 section 6.2.3.1: picture_coding_extension() header */
  372. EXTERN int f_code[2][2];
  373. EXTERN int intra_dc_precision;
  374. EXTERN int picture_structure;
  375. EXTERN int top_field_first;
  376. EXTERN int frame_pred_frame_dct;
  377. EXTERN int concealment_motion_vectors;
  378.  
  379. EXTERN int intra_vlc_format;
  380.  
  381. EXTERN int repeat_first_field;
  382.  
  383. EXTERN int chroma_420_type;
  384. EXTERN int progressive_frame;
  385. EXTERN int composite_display_flag;
  386. EXTERN int v_axis;
  387. EXTERN int field_sequence;
  388. EXTERN int sub_carrier;
  389. EXTERN int burst_amplitude;
  390. EXTERN int sub_carrier_phase;
  391.  
  392.  
  393.  
  394. /* ISO/IEC 13818-2 section 6.2.3.3: picture_display_extension() header */
  395. EXTERN int frame_center_horizontal_offset[3];
  396. EXTERN int frame_center_vertical_offset[3];
  397.  
  398.  
  399.  
  400. /* ISO/IEC 13818-2 section 6.2.2.5: sequence_scalable_extension() header */
  401. EXTERN int layer_id;
  402. EXTERN int lower_layer_prediction_horizontal_size;
  403. EXTERN int lower_layer_prediction_vertical_size;
  404. EXTERN int horizontal_subsampling_factor_m;
  405. EXTERN int horizontal_subsampling_factor_n;
  406. EXTERN int vertical_subsampling_factor_m;
  407. EXTERN int vertical_subsampling_factor_n;
  408.  
  409.  
  410. /* ISO/IEC 13818-2 section 6.2.3.5: picture_spatial_scalable_extension() header */
  411. EXTERN int lower_layer_temporal_reference;
  412. EXTERN int lower_layer_horizontal_offset;
  413. EXTERN int lower_layer_vertical_offset;
  414. EXTERN int spatial_temporal_weight_code_table_index;
  415. EXTERN int lower_layer_progressive_frame;
  416. EXTERN int lower_layer_deinterlaced_field_select;
  417.  
  418.  
  419.  
  420.  
  421.  
  422.  
  423. /* ISO/IEC 13818-2 section 6.2.3.6: copyright_extension() header */
  424. EXTERN int copyright_flag;
  425. EXTERN int copyright_identifier;
  426. EXTERN int original_or_copy;
  427. EXTERN int copyright_number_1;
  428. EXTERN int copyright_number_2;
  429. EXTERN int copyright_number_3;
  430.  
  431. /* ISO/IEC 13818-2 section 6.2.2.6: group_of_pictures_header()  */
  432. EXTERN int drop_flag;
  433. EXTERN int hour;
  434. EXTERN int minute;
  435. EXTERN int sec;
  436. EXTERN int frame;
  437. EXTERN int closed_gop;
  438. EXTERN int broken_link;
  439.  
  440.  
  441. #define STREAMBUFSIZE 65536
  442.  
  443. /* layer specific variables (needed for SNR and DP scalability) */
  444. EXTERN struct layer_data {
  445.   /* from mpeg2play */
  446.   unsigned int Bfr;         /* Bfr must always stay at offset 0! (phx) */
  447.   unsigned char *Rdmax;
  448.   int Incnt;                /* Incnt must always stay at offset 8! (phx) */
  449.   int Bitcnt;
  450.   unsigned int Bak;         /* general purpose backup field - Offset 16! */
  451.   /* sequence header and quant_matrix_extension() */
  452.   int intra_quantizer_matrix[64];
  453.   int non_intra_quantizer_matrix[64];
  454.   int chroma_intra_quantizer_matrix[64];
  455.   int chroma_non_intra_quantizer_matrix[64];
  456.   
  457.   int load_intra_quantizer_matrix;
  458.   int load_non_intra_quantizer_matrix;
  459.   int load_chroma_intra_quantizer_matrix;
  460.   int load_chroma_non_intra_quantizer_matrix;
  461.  
  462.   int MPEG2_Flag;
  463.   /* sequence scalable extension */
  464.   int scalable_mode;
  465.   /* picture coding extension */
  466.   int q_scale_type;
  467.   int alternate_scan;
  468.   /* picture spatial scalable extension */
  469.   int pict_scal;
  470.   /* slice/macroblock */
  471.   int priority_breakpoint;
  472.   int quantizer_scale;
  473.   int intra_slice;
  474.   short block[12][64];
  475.  
  476.   /* bit input */
  477.   FILE *Infile;
  478.   unsigned char *Rdptr;
  479.   unsigned char Inbfr[16];
  480.   unsigned char Rdbfr[STREAMBUFSIZE];
  481. } base, enhan, *ld;
  482.  
  483.  
  484.  
  485. #ifdef VERIFY
  486. EXTERN int verify_sequence_header;
  487. EXTERN int verify_group_of_pictures_header;
  488. EXTERN int verify_picture_header;
  489. EXTERN int verify_slice_header;
  490. EXTERN int verify_sequence_extension;
  491. EXTERN int verify_sequence_display_extension;
  492. EXTERN int verify_quant_matrix_extension;
  493. EXTERN int verify_sequence_scalable_extension;
  494. EXTERN int verify_picture_display_extension;
  495. EXTERN int verify_picture_coding_extension;
  496. EXTERN int verify_picture_spatial_scalable_extension;
  497. EXTERN int verify_picture_temporal_scalable_extension;
  498. EXTERN int verify_copyright_extension;
  499. #endif /* VERIFY */
  500.  
  501.  
  502. EXTERN int Decode_Layer;
  503.  
  504. /* verify.c */
  505. #ifdef VERIFY
  506. void Check_Headers _ANSI_ARGS_((int Bitstream_Framenum, int Sequence_Framenum));
  507. void Clear_Verify_Headers _ANSI_ARGS_((void));
  508. #endif /* VERIFY */
  509.  
  510.  
  511. EXTERN int global_MBA;
  512. EXTERN int global_pic;
  513. EXTERN int True_Framenum;
  514.  
  515.  
  516. #ifdef __PPC__
  517. /* PowerPC inline assembler optimizations (phx) */
  518.  
  519. unsigned int Show_Bits(int N) =
  520.     "\t.extern\t_ld\n"
  521.     "\tlwz\tr4,_ld(r2)\n"
  522.     "\tsubfic\tr5,r3,32\n"  /* 32-N */
  523.     "\tlwz\tr4,0(r4)\n"     /* ld->Bfr */
  524.     "\tsrw\tr3,r4,r5";
  525.  
  526. void Flush_Buffer(int N) =
  527.     "\t.extern\t_ld\n"
  528.     "\t.extern\t__Flush_Buffer\n"
  529.     "\tlwz\tr4,_ld(r2)\n"
  530.     "\tlwz\tr5,0(r4)\n"     /* ld->Bfr */
  531.     "\tslw\tr5,r5,r3\n"
  532.     "\tlwz\tr6,8(r4)\n"     /* ld->Incnt */
  533.     "\tstw\tr5,0(r4)\n"
  534.     "\tsub\tr3,r6,r3\n"
  535.     "\tcmpwi\tr3,24\n"
  536.     "\tstw\tr3,8(r4)\n"
  537.     "\tbgt+\t$+8\n"
  538.     "\tbl\t__Flush_Buffer\n"
  539.     "#barrier";
  540.  
  541. unsigned int Get_Bits(int N) =
  542.     "\t.extern\t_ld\n"
  543.     "\t.extern\t__Flush_Buffer\n"
  544.     "\tlwz\tr4,_ld(r2)\n"
  545.     "\tmr\tr11,r3\n"
  546.     "\tsubfic\tr5,r3,32\n"  /* 32-N */
  547.     "\tlwz\tr6,0(r4)\n"     /* ld->Bfr */
  548.     "\tsrw\tr3,r6,r5\n"
  549.     "\tslw\tr6,r6,r11\n"
  550.     "\tlwz\tr7,8(r4)\n"     /* ld->Incnt */
  551.     "\tstw\tr6,0(r4)\n"
  552.     "\tsub\tr7,r7,r11\n"
  553.     "\tcmpwi\tr7,24\n"
  554.     "\tstw\tr7,8(r4)\n"
  555.     "\tbgt+\t$+24\n"
  556.     "\tstw\tr3,16(r4)\n"    /* save Val in ld->Bak */
  557.     "\tmr\tr3,r7\n"
  558.     "\tbl\t__Flush_Buffer\n"
  559.     "\tlwz\tr4,_ld(r2)\n"
  560.     "\tlwz\tr3,16(r4)\n"    /* restore Val after Flush_Buffer() */
  561.     "#barrier";
  562.  
  563. unsigned int Get_Bits1(void) =
  564.     "\t.extern\t_ld\n"
  565.     "\t.extern\t__Flush_Buffer\n"
  566.     "\tlwz\tr4,_ld(r2)\n"
  567.     "\tlwz\tr6,0(r4)\n"     /* ld->Bfr */
  568.     "\tsrwi\tr3,r6,31\n"
  569.     "\tlwz\tr7,8(r4)\n"     /* ld->Incnt */
  570.     "\tadd\tr6,r6,r6\n"
  571.     "\tstw\tr6,0(r4)\n"
  572.     "\tsubi\tr7,r7,1\n"
  573.     "\tcmpwi\tr7,24\n"
  574.     "\tstw\tr7,8(r4)\n"
  575.     "\tbgt+\t$+24\n"
  576.     "\tstw\tr3,16(r4)\n"    /* save Val in ld->Bak */
  577.     "\tmr\tr3,r7\n"
  578.     "\tbl\t__Flush_Buffer\n"
  579.     "\tlwz\tr4,_ld(r2)\n"
  580.     "\tlwz\tr3,16(r4)\n"    /* restore Val after Flush_Buffer() */
  581.     "#barrier";
  582.  
  583. int Get_Byte(void) =
  584.     "\t.include\t\"layer_data.i\"\n"
  585.     "\t.extern\t_ld\n"
  586.     "\t.extern\t_fread\n"
  587.     "\tlwz\tr4,_ld(r2)\n"
  588.     "\tlwz\tr11,Rdptr(r4)\n"
  589.     "\tla\tr3,Rdbfr(r4)\n"
  590.     "#barrier\n"
  591.     ".ifge\tSTREAMBUFSIZE-32768\n"
  592.     "\taddis\tr12,r3,STREAMBUFSIZE@ha\n"
  593.     "\taddi\tr12,r12,STREAMBUFSIZE@l\n"
  594.     ".else\n"
  595.     "\taddi\tr12,r3,STREAMBUFSIZE\n"
  596.     ".endif\n"
  597.     "\tcmplw\tr11,r12\n"
  598.     ".ifge\tSTREAMBUFSIZE-32768\n"
  599.     "\tblt+\t$+68\n"
  600.     ".else\n"
  601.     "\tblt+\t$+56\n"
  602.     ".endif\n"
  603.     "\tlwz\tr6,Infile(r4)\n"
  604.     "\tli\tr4,1\n"
  605.     ".ifge\tSTREAMBUFSIZE-32768\n"
  606.     "\tlis\tr5,STREAMBUFSIZE@h\n"
  607.     "\tori\tr5,r5,STREAMBUFSIZE@l\n"
  608.     ".else\n"
  609.     "\tli\tr5,STREAMBUFSIZE\n"
  610.     ".endif\n"
  611.     "\tbl\t_fread\n"        /* fread() */
  612.     "\tlwz\tr4,_ld(r2)\n"
  613.     "\tlwz\tr11,Rdptr(r4)\n"
  614.     "\tlwz\tr12,Rdmax(r4)\n"
  615.     "\tla\tr3,Rdbfr(r4)\n"
  616.     ".ifge\tSTREAMBUFSIZE-32768\n"
  617.     "\tsubis\tr11,r11,STREAMBUFSIZE@ha\n"
  618.     "\tsubi\tr11,r11,STREAMBUFSIZE@l\n"
  619.     "\tstw\tr11,Rdptr(r4)\n"
  620.     "\tsubis\tr12,r12,STREAMBUFSIZE@ha\n"
  621.     "\tsubi\tr12,r12,STREAMBUFSIZE@l\n"
  622.     "\tstw\tr12,Rdmax(r4)\n"
  623.     "\tb\t$-76\n"
  624.     ".else\n"
  625.     "\tsubi\tr11,r11,STREAMBUFSIZE\n"
  626.     "\tstw\tr11,Rdptr(r4)\n"
  627.     "\tsubi\tr12,r12,STREAMBUFSIZE\n"
  628.     "\tstw\tr12,Rdmax(r4)\n"
  629.     "\tb\t$-60\n"
  630.     ".endif\n"
  631.     "#barrier\n"
  632.     "\tlbz\tr3,0(r11)\n"
  633.     "\taddi\tr11,r11,1\n"
  634.     "\tstw\tr11,Rdptr(r4)";
  635.  
  636. int Get_Word(void) =
  637.     "\t.include\t\"layer_data.i\"\n"
  638.     "\t.extern\t_ld\n"
  639.     "\t.extern\t_fread\n"
  640.     "\tlwz\tr4,_ld(r2)\n"
  641.     "\tlwz\tr11,Rdptr(r4)\n"
  642.     "\tla\tr3,Rdbfr(r4)\n"
  643.     "#barrier\n"
  644.     ".ifge\tSTREAMBUFSIZE-32768\n"
  645.     "\taddis\tr12,r3,STREAMBUFSIZE@ha\n"
  646.     "\taddi\tr12,r12,STREAMBUFSIZE@l\n"
  647.     ".else\n"
  648.     "\taddi\tr12,r3,STREAMBUFSIZE\n"
  649.     ".endif\n"
  650.     "\tcmplw\tr11,r12\n"
  651.     ".ifge\tSTREAMBUFSIZE-32768\n"
  652.     "\tblt+\t$+68\n"
  653.     ".else\n"
  654.     "\tblt+\t$+56\n"
  655.     ".endif\n"
  656.     "\tlwz\tr6,Infile(r4)\n"
  657.     "\tli\tr4,1\n"
  658.     ".ifge\tSTREAMBUFSIZE-32768\n"
  659.     "\tlis\tr5,STREAMBUFSIZE@h\n"
  660.     "\tori\tr5,r5,STREAMBUFSIZE@l\n"
  661.     ".else\n"
  662.     "\tli\tr5,STREAMBUFSIZE\n"
  663.     ".endif\n"
  664.     "\tbl\t_fread\n"        /* fread() */
  665.     "\tlwz\tr4,_ld(r2)\n"
  666.     "\tlwz\tr11,Rdptr(r4)\n"
  667.     "\tlwz\tr12,Rdmax(r4)\n"
  668.     "\tla\tr3,Rdbfr(r4)\n"
  669.     ".ifge\tSTREAMBUFSIZE-32768\n"
  670.     "\tsubis\tr11,r11,STREAMBUFSIZE@ha\n"
  671.     "\tsubi\tr11,r11,STREAMBUFSIZE@l\n"
  672.     "\tstw\tr11,Rdptr(r4)\n"
  673.     "\tsubis\tr12,r12,STREAMBUFSIZE@ha\n"
  674.     "\tsubi\tr12,r12,STREAMBUFSIZE@l\n"
  675.     "\tstw\tr12,Rdmax(r4)\n"
  676.     "\tb\t$-76\n"
  677.     ".else\n"
  678.     "\tsubi\tr11,r11,STREAMBUFSIZE\n"
  679.     "\tstw\tr11,Rdptr(r4)\n"
  680.     "\tsubi\tr12,r12,STREAMBUFSIZE\n"
  681.     "\tstw\tr12,Rdmax(r4)\n"
  682.     "\tb\t$-60\n"
  683.     ".endif\n"
  684.     "#barrier\n"
  685.     "\tlbz\tr10,0(r11)\n"
  686.     "\taddi\tr11,r11,1\n"
  687.     "\tstw\tr11,Rdptr(r4)\n"
  688.     /* get low byte */
  689.     "#barrier\n"
  690.     ".ifge\tSTREAMBUFSIZE-32768\n"
  691.     "\taddis\tr12,r3,STREAMBUFSIZE@ha\n"
  692.     "\taddi\tr12,r12,STREAMBUFSIZE@l\n"
  693.     ".else\n"
  694.     "\taddi\tr12,r3,STREAMBUFSIZE\n"
  695.     ".endif\n"
  696.     "\tcmplw\tr11,r12\n"
  697.     ".ifge\tSTREAMBUFSIZE-32768\n"
  698.     "\tblt+\t$+76\n"
  699.     ".else\n"
  700.     "\tblt+\t$+64\n"
  701.     ".endif\n"
  702.     "\tlwz\tr6,Infile(r4)\n"
  703.     ".ifge\tSTREAMBUFSIZE-32768\n"
  704.     "\tlis\tr5,STREAMBUFSIZE@h\n"
  705.     "\tori\tr5,r5,STREAMBUFSIZE@l\n"
  706.     ".else\n"
  707.     "\tli\tr5,STREAMBUFSIZE\n"
  708.     ".endif\n"
  709.     "\tstw\tr10,Bak(r4)\n"  /* save high byte */
  710.     "\tli\tr4,1\n"
  711.     "\tbl\t_fread\n"        /* fread() */
  712.     "\tlwz\tr4,_ld(r2)\n"
  713.     "\tlwz\tr11,Rdptr(r4)\n"
  714.     "\tlwz\tr12,Rdmax(r4)\n"
  715.     "\tla\tr3,Rdbfr(r4)\n"
  716.     "\tlwz\tr10,Bak(r4)\n"  /* restore hight byte */
  717.     ".ifge\tSTREAMBUFSIZE-32768\n"
  718.     "\tsubis\tr11,r11,STREAMBUFSIZE@ha\n"
  719.     "\tsubi\tr11,r11,STREAMBUFSIZE@l\n"
  720.     "\tstw\tr11,Rdptr(r4)\n"
  721.     "\tsubis\tr12,r12,STREAMBUFSIZE@ha\n"
  722.     "\tsubi\tr12,r12,STREAMBUFSIZE@l\n"
  723.     "\tstw\tr12,Rdmax(r4)\n"
  724.     "\tb\t$-84\n"
  725.     ".else\n"
  726.     "\tsubi\tr11,r11,STREAMBUFSIZE\n"
  727.     "\tstw\tr11,Rdptr(r4)\n"
  728.     "\tsubi\tr12,r12,STREAMBUFSIZE\n"
  729.     "\tstw\tr12,Rdmax(r4)\n"
  730.     "\tb\t$-68\n"
  731.     ".endif\n"
  732.     "#barrier\n"
  733.     "\tlbz\tr3,0(r11)\n"
  734.     "\taddi\tr11,r11,1\n"
  735.     "\tstw\tr11,Rdptr(r4)\n"
  736.     "\trlwimi\tr3,r10,8,16,23";
  737.  
  738. #endif /* __PPC_ */
  739.